package com.wlc.oop.demo08.numberandstr;

import com.sun.deploy.util.StringUtils;

import java.util.Arrays;
import java.util.stream.Collectors;

/**
 * @author 王立朝 wanglichao@champion-credit.com
 * @description 数字与字符串   字符串转换
 * @date 2021-07-08 10:04
 */
public class Demo02 {

    /**
     * 数字转字符串
     * 1、使用String.valueOf()
     * 2、使用装箱类型，然后调用toString()
     * <p>
     * 字符串转换为数字  注意：  字符串必须是数字类型；否则会报错
     * 通过Integer.parseInt("")
     * Double.parseDouble("")
     */
    public void method01() {
        int num = 2;
        // 通过使用String.valueOf() 把 数字转换为字符串
        String s = String.valueOf(num);
        Integer integer = num;
        // 通过包装类型的toStirng 方法把数字转换为 字符串
        String s1 = integer.toString();
        System.out.println("======");
        String abc = "124";
        // 使用Integer.parseInt("")  把字符串转换为数字
        int i = Integer.parseInt(abc);
        System.out.println("s1 = " + s1);
        System.out.println("i = " + i);
        System.out.println("Double.parseDouble(abc) = " + Double.parseDouble(abc));
    }

    /**
     * 字符串转数字
     */
    public void method02() {
        String abc = "134";
        int i = Integer.parseInt(abc);
        System.out.println("i = " + i);
    }

    /**
     * 字符串格式化
     * %d 数字
     * %n 换行
     * %s 字符串
     */
    public void method03() {
        // %s : 代表字符串 ；   %d 代表数字   ；  %n代表换行
        String name = "王立朝";
        int age = 20;
        String address = "河南省安阳市动摇正";
        String str = " 姓名：%s,年龄： %d 岁,%n 家住在: %s";
        System.out.printf(str, name, age, address);
    }

    /**
     * 字符 char
     */
    public void method04() {

        // 保存一个字符的时候用 char
        char c = 'a';
        // 一个字符只可以保存一个中文字； 一个字占2个字节
        //char c1 = '我的';
        char c2 = '我';
        // 字符1
        char c3 = '1';

        // char 对应的封装类是character
        // 装箱：  基本类型转换为封装类型
        Character character = c3;
        // 拆箱：  封装类型转换为基本类型
        char c4 = character;


    }

    /**
     * character 常见的方法
     */
    public void method05() {
        // 是否为数字
        System.out.println("Character.isDigit('3') = " + Character.isDigit('3'));
        // 是否为字母
        System.out.println("Character.isLetter('3') = " + Character.isLetter('3'));
        // 是否为空白
        System.out.println("Character.isWhitespace('') = " + Character.isWhitespace(' '));
        // 判断字符是否是大写
        System.out.println("Character.isUpperCase('A') = " + Character.isUpperCase('A'));
        // 判断字符是否是小写
        System.out.println("Character.isLowerCase('a') = " + Character.isLowerCase('A'));
        // 转换为大写
        System.out.println("Character.toUpperCase('A') = " + Character.toUpperCase('a'));
        // 转换为小写
        System.out.println("Character.toLowerCase('A') = " + Character.toLowerCase('A'));
    }

    /**
     * 字符串常用的方法
     */
    public void method06() {
        // 1、 charAt(int index) 获取指定位置的字符
        String str = "abc我是一个,中国人def   ";
        char c = str.charAt(1);
        System.out.println("c = " + c);
        System.out.println("========");
        // 2、toCharArray() 获取对应的字符数组
        char[] chars = str.toCharArray();
        System.out.println(chars.length == str.length());

        System.out.println("========");
        // 3、截取字符串 subString()
        System.out.println("str.substring(1) = " + str.substring(1));
        System.out.println("========");
        // 4、subString(startIndex,endIndex)  取值范围[startIndex,endIndex)
        System.out.println("str.substring(1,3) = " + str.substring(1, 3));
        System.out.println("=========");
        // 5、根据字符串分割 split(",")  , 把str分割成了2句话
        String[] split = str.split(",");
        for (String s : split) {
            System.out.println("s = " + s);
        }

        System.out.println("=========");
        // 6、去掉首尾空格 trim()
        System.out.println("str = " + str);
        System.out.println("str.trim() = " + str.trim());
        System.out.println("=========");
        // 7、全部变为大写toUpperCase()    ; 全部变为小写  toLowerCase()
        System.out.println("str.toLowerCase() = " + str.toLowerCase());
        System.out.println("str.toUpperCase() = " + str.toUpperCase());
        System.out.println("=========");
        // 8、 定位   indexOf() 判断字符或者字符串出现的位置； contains() 判断字符串中是否包含某个字符
        System.out.println("str.indexOf(\"我\") = " + str.indexOf("我"));
        System.out.println("str.contains(\"中\") = " + str.contains("中"));
        System.out.println("=========");
        // 9、替换  replaceAll 替换所有的；   replaceFirst: 替换第一个

        System.out.println(str.replaceAll("我", "哈哈哈"));
        System.out.println(str.replaceFirst(" ", "空格"));


    }


    public void method07() {
        String str = "hello world java";
        String[] s = str.split(" ");
        for (int i = 0; i < s.length; i++) {
            // 得到每一组的第一个字母，转换为大写
            String word = s[i];
            char one = Character.toUpperCase(word.charAt(0));
            String other = word.substring(1);
            s[i] = one + other;
        }
        String result = "";
        for (String w : s) {
            result += w + " ";
        }
        String trim = result.trim();
        System.out.println("trim = " + trim);
    }

    public void method08() {
        String str = "hello world java";
        System.out.println("StringUtils.splitString(str,\" \") = " + StringUtils.splitString(str, " ")[0]);
        String[] s = str.split(" ");
        for (int i = 0; i < s.length; i++) {
            s[i] = captureName(s[i].substring(0, 1)) + s[i].substring(1);
        }
        String s1 = Arrays.stream(s).collect(Collectors.joining(" ")).toString();
        System.out.println("s1 = " + s1);

    }

    /**
     * 首字母转换为大写，并把结果输出
     */
    public void method09() {
        String str = "hello world java";
        String[] s = str.split(" ");
        for (int i = 0; i < s.length; i++) {
            String word = s[i];
            s[i] = Character.toUpperCase(word.charAt(0)) + s[i].substring(1);
        }
        String result = Arrays.stream(s).collect(Collectors.joining(" ")).trim().toString();
        System.out.println("result =" + result);
    }

    /**
     * 将字符串的首字母转大写
     *
     * @param str 需要转换的字符串
     * @return
     */
    private static String captureName(String str) {
        // 进行字母的ascii编码前移，效率要高于截取字符串进行转换的操作
        char[] cs = str.toCharArray();
        cs[0] -= 32;
        return String.valueOf(cs);
    }

    public void method10() {

        String str1 = "the light";

        String str2 = "the light";

        String str3 = "hello";
        String str4 = "hello";
        //==用于判断是否是同一个字符串对象
        System.out.println(str1 == str2);
        System.out.println("str3 == str4 = " + str3 == str4);

    }

    public void method11() {

        String str1 = "the light123";

        String str2 = "the light123";

        String str3 = "hello";
        String str4 = "hello";
        //==用于判断是否是同一个字符串对象
        System.out.println(str1 == str2);
        System.out.println(str3 == str4);

        for (short i = 'a'; i < 'z'; i++) {
            System.out.println("i = " + (char) i);
        }
    }

    public void method12() {
        String abc = "hello";
        StringBuffer sb = new StringBuffer("abc");
        System.out.println("abc.length() = " + abc.length());
        System.out.println("sb.length() = " + sb.length());
        System.out.println("StringBuffer的总空间 = " + sb.capacity());
        sbAppend();
        strAppend();
    }

    public void sbAppend() {
        long start = System.currentTimeMillis();
        System.out.println("System.currentTimeMillis() = " + System.currentTimeMillis());
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < 1000; i++) {
            sb.append(i);
        }
        long end = System.currentTimeMillis();
        System.out.println("StirngBuffer字符串拼接需要的时间为： = " + (end - start) + " 秒");
        StringBuilder sb2 = new StringBuilder("");
    }

    public void strAppend() {
        long start = System.currentTimeMillis();
        String str = "";
        for (int i = 0; i < 1000; i++) {
            str += i;
        }
        long end = System.currentTimeMillis();
        System.out.println("字符串拼接需要的时间为： = " + (end - start) + "秒");
    }


    public static void main(String[] args) {
        new Demo02().method12();
    }
}
